﻿#include<iostream>
#include<vector>
#include<algorithm>
#include<numeric>
using namespace std;
/*
老师想给孩子们分发糖果，有 N 个孩子站成了一条直线，老师会根据每个孩子的表现，预先给他们评分。

你需要按照以下要求，帮助老师给这些孩子分发糖果：

每个孩子至少分配到 1 个糖果。
评分更高的孩子必须比他两侧的邻位孩子获得更多的糖果。
那么这样下来，老师至少需要准备多少颗糖果呢？

 

示例 1：

输入：[1,0,2]
输出：5
解释：你可以分别给这三个孩子分发 2、1、2 颗糖果。
示例 2：

输入：[1,2,2]
输出：4
解释：你可以分别给这三个孩子分发 1、2、1 颗糖果。
	 第三个孩子只得到 1 颗糖果，这已满足上述两个条件。
*/


//解题思路: 利用高分的比二测的邻位孩子获取更多糖果,可以利用二重循环,从左到右,再从右到左,第二次循环的时候需要取当前孩子的糖果和左边孩子+1的最大值

class Solution {
public:
	int candy(vector<int>& ratings) {
		vector<int> cand(ratings.size(), 1);
		for (int i = 0; i < ratings.size() - 1; ++i) {    //从左到右
			if (ratings[i + 1] > ratings[i])
				cand[i + 1] = cand[i] + 1;
		}

		for (int i = ratings.size() - 1; i > 0; --i) {   //从右到左
			if (ratings[i - 1] > ratings[i])
				cand[i - 1] = max(cand[i - 1], cand[i] + 1);

		}

		return accumulate(cand.begin(), cand.end(), 0);
	}
};